package main

import "fmt"

func main() {

	// var arr = [3]string {"张三","里斯","王五"}
	// for_test(arr)
	// test1()
	// test2()
	// test3()
	// test4()
	// test5()
	// test6()
	// test7()
	test8()
}

func array() {
	// 定义一个长度为3的int数组  var 数组变量名 [元素数量]T
	var a1 = [3]int{2, 3, 4}
	fmt.Println(a1)

	// 数组的长度必须是常量，并且长度是数组类型的一部分。
	//一旦定义，长度不能变。 [5]int和[10]int是不同的类型。
	const len = 3
	var a2 [len]int
	fmt.Println(a2)

	// var a3 [3]int
	// var b [4]int
	// a3 = b //不可以这样做，因为此时a和b是不同的类型
}

// 遍历数组
func for_test(str [3]string) {
	for _, v := range str {
		fmt.Printf(v) // 如果是字符串数组的话，不用%c转义
	}

}

// 数组定义
func test1() {
	var testArray [3]int
	var testArray2 = [...]int{1, 2, 3}
	fmt.Println(testArray)
	fmt.Println(testArray2)

	// %T表示的是类型
	fmt.Printf("testArray3的类型是：%T\t", testArray2)
}

// 我们还可以使用指定索引值的方式来初始化数组，例如:
func test2() {
	arr := [4]int{0: 1, 2: 3, 3}
	fmt.Println(arr)
}

// 一维数组遍历
func test3() {
	arr := [3]string{"张三", "李四", "王五"}
	//方法一：for循环遍历
	for i := 0; i < len(arr); i++ {
		fmt.Println(arr[i])
	}

	//方法二 for range遍历
	for _, v := range arr {
		fmt.Println(v)
	}

}

// 二维数组的遍历
func test4() {
	arr := [][]string{
		{"北京", "上海"},
		{"广州", "深圳"},
		{"成都", "重庆"},
	}
	for _, v1 := range arr {
		for _, v2 := range v1 {
			fmt.Printf("%s\t", v2)
		}
		fmt.Println()
	}
}

func test5() {
	arr := []int{1, 2, 3}
	arr_0 := arr[0]
	arr[0] = arr_0 + 1
	fmt.Printf("%v\t", arr)
	fmt.Printf("%v\t", arr_0)
}

func test6() {
	arr := [...]int{1, 2, 3}
	fmt.Println(len(arr))
	// arr = append(arr,4,5,6) slice才能append
	fmt.Println(arr)
	arr1 := []int{1, 2, 3}
	fmt.Println(len(arr1))
}

// 求数组[1, 3, 5, 7, 8]所有元素的和
func test7() {
	arr := [5]int{1, 3, 5, 7, 8}
	var sum int
	for _, v := range arr {
		sum += v
	}
	fmt.Println(sum)

}

// 找出数组中和为指定值的两个元素的下标，比如从数组[1, 3, 5, 7, 8]
// 中找出和为8的两个元素的下标分别为(0,3)和(1,2)。
func test8() {
	arr := [5]int{1, 3, 5, 7, 8}
	for i, v1 := range arr {
		for j, v2 := range arr {
			if v1+v2 == 8 {
				fmt.Printf("(%v , %v)", i, j)
			}
		}
	}
}
